﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Configuration;
using System.Data.SqlClient;
using Website.Logger;
using UtilityExtensions;
using WebLib;
using System.Web.Script.Services;
using System.Web.Services;
using BOL;
using BOL.UI;
using BOL.Cliente;
using BOL.Ventas;
using DAL;


namespace UILGestion.VentaAdmin.DocumentoVenta
{
    public partial class DocumentoVentaEditForm : System.Web.UI.Page
    {
        [WebMethod(), ScriptMethod()]
        public static string GetCliente(String prefixText, String contextKey)
        {

            ClienteSearchInfo nuevo = new ClienteSearchInfo();
            nuevo.descripcion = "<strong><span  style='color: #FFFF00;background-color: #800000;'>Registrar nuevo Cliente</span></strong>";
            nuevo.idInternal = 0;


            var p = (from a in DbUtil.Db.Clientes
                     where (a.descripcion).Contains(prefixText)
                    
                     select new ClienteSearchInfo
                     {
                         idInternal = a.idInternal,
                         descripcion = a.descripcion,
                         numDocumento = a.numDocumento,
                         correo = a.email,
                         direccion = a.Direccion.descripcion,
                         telefono = a.telefono,
                         tipoDocumento=a.TipoDocumento.abreviacion,
                         vista=String.Format("{0}:{1} {2}", a.TipoDocumento.abreviacion, a.numDocumento,a.descripcion),
                     }).Take(35);

            var q = p.ToList();
            q.Add(nuevo);
            return Util.Tbl2Str(Util.EntidadToDataTable(q));

        }


        
        [WebMethod(), ScriptMethod()]
        public static string GETUI(String prefixText, String contextKey)
        {
            var p = (from a in DbUtil.Db.UIs
                     where (a.codigo + a.descripcion).Contains(prefixText) &
                     a.idEstado == 1
                     select new UISearchInfo
                     {
                         idInternal = a.idInternal,
                         localizacion = a.UILocalizacion.descripcion,
                         piso = a.UIBloque.descripcion,
                         codigo = a.codigo,
                         descripcion = a.descripcion,
                         moneda = a.Moneda.simbol,
                         precio = a.precio.ToString(),

                     }).Take(35);



            return Util.Tbl2Str(Util.EntidadToDataTable(p));

        }

        public DocumentoVentaEditForm()
        {
            bol = new DocumentoVentaBL();
        }

        private DocumentoVentaBL bol;
        private string DOCUMENTOVENTAITEMINFO = "DocumentoVentaitemInfo";

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                try
                {
                     type.Value = (string)Request.QueryString["type"];
                     internalID.Value = (string)Request.QueryString["id"];
                     idProyecto.Value = (string)Request.QueryString["idProyecto"];
                     idOrdenVentaItemTXT.Text = (string)Request.QueryString["idOrdenVentaItem"];
                     paginaAnt.Value = Page.Request.UrlReferrer.AbsoluteUri;
                     menuCtrl1.loadMenuVenta(idProyecto.Value.ToInt());
                     type.Value = (type.Value == String.Empty) ? "A" : type.Value;
                     idColeccionLista.Value = (string)Request.QueryString["idColeccion"];
                     FormatForm();

                }
                catch (SqlException sqlex)
                {
                    WebServerSideSqlError.Log(sqlex);

                    ScriptManager.RegisterClientScriptBlock(this, typeof(Page),
                     "uniqueKey" + DateTime.Now, "alert('" + sqlex.Message.Replace("'", "") + "');", true);


                }
                catch (Exception ex)
                {
                    WebServerSideError.Log(ex);
                    ScriptManager.RegisterClientScriptBlock(this, typeof(Page),
                         "uniqueKey" + DateTime.Now, "alert('" + ex.Message.Replace("'", "") + "');", true);

                }

            }
        }


        private void Insert()
        {
            List<DocumentoVentaitemInfo>  ds = (List<DocumentoVentaitemInfo>)Session[idColeccion.Value];
            internalID.Value = bol.Add(fechaTXT.Text.ToDate().Value,
                                        tipoDocumentoDDL.SelectedValue.ToInt(),
                                        numDocumentoTXT.Text,
                                        idClienteTXT.Text.ToInt(),
                                       comentarioTXT.Text,
                                       idOrdenVentaItemTXT.Text.ToInt(),
                                       monedaDDL.SelectedValue.ToInt(),
                                       idProyecto.Value.ToInt(),
                                       ds
                                       ).ToString();

              }

        private void Update()
        {
            //DataSet ds = (DataSet)Session[idColeccion.Value];
            //bol.UpdateOrdenVenta(internalID.Value.ToInt(),
            //                copropietarioCHK.Checked,
            //                idCoClienteTXT.Text.ToInt(),
            //              formatoVentaDDL.SelectedValue.ToInt(),
            //                comentarioTXT.Text,
            //                bancoDDL.SelectedValue.ToInt(),
            //                 cuentaAhorroCHK.Checked,
            //                ds
            //                );

            
        }

        


        protected void button(object sender, EventArgs e)
        {
            
            try
            {

                if ((sender as Button).ID ==saveBTN.ID)
                {

                    if (type.Value == "E")   { Update(); }
                    if (type.Value == "A")    {Insert(); }

                    Response.Redirect("~/VentaAdmin/DocumentoVenta/DocumentoVentaReadForm.aspx?id={0}&idProyecto={2}".Fmt(internalID.Value, idEtapa.Value,idProyecto.Value), true);
                   

                }
                if ((sender as Button).ID == cancelarBTN.ID)
                {
                    Response.Redirect(paginaAnt.Value, true);
                }
                if ((sender as Button).ID ==refreshBTN.ID)
                {
                    FormatForm();
                }
                if ((sender as Button).ID == AddConceptoBTN.ID)
                {
                    
                    PendientePagoPanel2.DataBind();
                    AddDocumentoVentaModal.Show();
                }
                if ((sender as Button).ID == AddPendienteVentaBTN.ID)
                {
                    var lista = PendientePagoPanel2.SeleccionList;
                    foreach (var item in lista)
                    {
                        DocumentoVentaItemGrid1.LoadFromOrdenVentaFormato(idColeccion.Value.ToInt(), internalID.Value.ToInt(),
                            DbUtil.Db.OrdenVentaFormatos.Single(p => p.idInternal == item));

                    };
                    //itemUpdatePanel.Update();
                    AddDocumentoVentaModal.Hide();
                }
               


            }
            catch (SqlException sqlex)
            {
                WebServerSideSqlError.Log(sqlex);

                ScriptManager.RegisterClientScriptBlock(this, typeof(Page),
                 "uniqueKey" + DateTime.Now, "alert('" + sqlex.Message.Replace("'", "") + "');", true);


            }
            catch (Exception ex)
            {
                WebServerSideError.Log(ex);
                ScriptManager.RegisterClientScriptBlock(this, typeof(Page),
                     "uniqueKey" + DateTime.Now, "alert('" + ex.Message.Replace("'", "") + "');", true);

            }




        }
        private void ShowAllComboBox()
        {

            monedaDDL.DataValueField = "idInternal";
            monedaDDL.DataTextField = "descripcion";


          

            tipoDocumentoDDL.DataValueField = "idInternal";
            tipoDocumentoDDL.DataTextField = "descripcion";

           
            ListValueBL listas = new ListValueBL();
            //trae el detalle segun coresponda

            ListValueInfo todosCol = new ListValueInfo();
            todosCol.descripcion = "--------Seleccione Item---------";
            todosCol.idInternal = 0;

            //var f = listas.GetOrdenVentaPendientes(idProyecto.Value.ToInt());
            //f.Insert(0, todosCol);
            //ordenventaDDL.DataSource = f;
            monedaDDL.DataSource = listas.GetMoneda();
            monedaDDL.DataBind();

           // no incluir la nota de credito
            tipoDocumentoDDL.DataSource = listas.GetDocumentoTipoVenta().Where(p=>p.idInternal!=6);

           
            tipoDocumentoDDL.DataBind();
           
        }

        public void SetEstadistica()
        {

            List<DocumentoVentaitemInfo> item = (List<DocumentoVentaitemInfo>)Session[idColeccion.Value];

            

                totalLabel.Text = "0.00";
                montoInafectoLBL.Text="0.00";
                montoAfectoLBL.Text="0.00";
                totalIGVLBL.Text = "0.00";
                
                // segun la moneda de la venta
                if (item.Count()>0)
                {
                    
                totalLabel.Text = item.Sum(p=>p.total).ToString("N");
                montoInafectoLBL.Text=item.Sum(p=>p.subTotal).ToString("N");
                montoAfectoLBL.Text = item.Sum(p => p.subTotal).ToString("N");
                totalIGVLBL.Text = item.Sum(p => p.IGVTotal).ToString("N");
                }

              
                totalUPNL.Update();
        }

        /// <summary>
        /// Solo crea el esquema necesario para la colecicon de UI item de Orden de Venta
        /// </summary>
        /// <param name="idParent"></param>
        private void LoadItem(int idParent)
        {

            var ordenVentaItemList = bol.GetDocumentoVentaItem(idParent);
            Session[idColeccion.Value] = ordenVentaItemList;
        }
     

        private void Load()
        {
            DAL.DocumentoVenta documentoVenta = DbUtil.Db.DocumentoVentas.Single(p => p.idInternal == internalID.Value.ToInt());

            fechaTXT.Text = documentoVenta.fecha.ToShortDateString();
            numDocumentoTXT.Text = documentoVenta.numeroDoc;
            tipoDocumentoDDL.SelectedValue = documentoVenta.idDocumentoTipo.ToString();
            monedaDDL.SelectedValue=documentoVenta.idMoneda.ToString();
            
            //numDocumentoClienteTXT.Text = documentoVenta.documentoCliente;
            //docclienteLBL.Text = documentoVenta.nombreCliente;
            //tipoDocumento.Text = documentoVenta.TipoDocumento.abreviacion; //del cliente

            //conceptoDDL.SelectedValue = documentoVenta.ConceptoItem.idInternal.ToString();

            //set el DATASET
            LoadItem(int.Parse(internalID.Value));
            //DocumentoVentaItemGrid1.Load(idColeccion.Value.ToInt(), internalID.Value.ToInt(), documentoVenta.ConceptoItem.descripcion);

        }

        //private void LoadFromOrdenVenta(DAL.OrdenVenta ordenVenta)
        //{
        //    if (ordenVentaItem != null)
        //    {

        //        monedaLBL.Text = ordenVentaItem.Moneda.descripcion;
               



        //        // nivel de control a nivel de  ui

        //        DocumentoVentaItemGrid1.LoadFromOrdenVentaItem(idColeccion.Value.ToInt(),
        //                                                        internalID.Value.ToInt(),
        //                                                        conceptoDDL.SelectedItem.Text,
        //                                                        ordenVentaItem);


        //    }
        //}

        private void LoadClienteFromOrdenVenta(DAL.OrdenVentaItem ordenVenta)
        {
            if (ordenVenta != null)
            {
                var cliente = ordenVenta.OrdenVenta.Cliente;
                NumDocuClienteLBL.Text = cliente.numDocumento;
                
                //clienteHLK.
                TipoDocClienteLBL.Text = cliente.TipoDocumento.abreviacion;
                direccionLBL.Text = cliente.Direccion.descripcion;
                idClienteTXT.Text = cliente.idInternal.ToString();

                DAL.Menu menu = DbUtil.Db.Menus.Single(p => p.idInternal == 111);//cliente
                //---------------------
                string val = String.Format("{0}?Type=A&id={1}",
                                                              menu.url,
                                                              cliente.idInternal);

                clienteHLK.Text = cliente.descripcion;
                clienteHLK.NavigateUrl = "javascript:loadTabFromForm('tab{0}','{1}','{2}');".Fmt(menu.idAplicacion,
                                                                                                  menu.Aplicacion.title,
                                                                                                  val);
                //------------------------

            }
        }
        private void LoadOrdenVenta(OrdenVentaItem ordenVentaItem)
        {
            ordenVentaHLK.Text = ordenVentaItem.OrdenVenta.numDocumento;
            ordenVentaHLK.NavigateUrl = String.Format("~/VentaAdmin/OrdenVenta/OrdenVentaReadForm.aspx?id={0}&dProyecto={1}", ordenVentaItem.idOrdenVenta, ordenVentaItem.OrdenVenta.idProyecto);
            UILBL.Text =string.Format("ETAPA: {0} </br>, LOCALIZACION:{1} {2}, DESCRIPCION:{3}",ordenVentaItem.UI.Etapa.descripcion, ordenVentaItem.UI.UILocalizacion.descripcion,ordenVentaItem.UI.UIBloque.descripcion,ordenVentaItem.UI.descripcion);
            idOrdenVentaItemTXT.Text = ordenVentaItem.idInternal.ToString();
        }


        private void FormatForm()
        {

            //--------------------
            //int idEmpleadoEmisor = int.Parse(System.Web.HttpContext.Current.Session["idEmpleado"].ToString());
            //bool acceso = new DAL.FormularioAcceso().VerificarAcceso(DbUtil.Db,
            //    idEmpleadoEmisor,
            //    11, //Proveeedor
            //    2); //lectura
            ////------------------------- 
            //// los paneles presentes en el formulario
            //pnlMain.Visible = true;
            ShowAllComboBox();
                
            //areTXT.Text="0.00";
            idColeccion.Value = Parametros.GenerarID().ToString();

            if (type.Value == "E")
            {
                Load();
               
                
            }
            if (type.Value == "A")
            {
                fechaTXT.Text = DateTime.Now.ToShortDateString();
                comentarioTXT.Text = string.Empty;
                   
                totalLabel.Text = "0.00";
                
                //set el DATASET
                

                LoadItem(internalID.Value.ToInt());  // para en caso del esquema
                //caso de saber la OVItem

                if (idOrdenVentaItemTXT.Text.ToInt() != 0)
                {
                    var ordenVentaItem = DbUtil.Db.OrdenVentaItems.SingleOrDefault(p => p.idInternal == idOrdenVentaItemTXT.Text.ToInt());
                    LoadClienteFromOrdenVenta(ordenVentaItem);
                    LoadOrdenVenta(ordenVentaItem);
                    monedaDDL.SelectedValue = ordenVentaItem.idMoneda.ToString();
                    simbol1LBL.Text = ordenVentaItem.Moneda.simbol;
                    simbol2LBL.Text = ordenVentaItem.Moneda.simbol;
                    simbol3LBL.Text = ordenVentaItem.Moneda.simbol;
                    simbol4LBL.Text = ordenVentaItem.Moneda.simbol;
                    //carlo los restantes a facturar
                    var q=bol.GetConceptosPendientesFacturacion(ordenVentaItem.idInternal);

                    foreach (var item in q)
                    {
                        DocumentoVentaItemGrid1.LoadFromOrdenVentaFormato(idColeccion.Value.ToInt(), 
                            internalID.Value.ToInt(),
                            item);

                    };
                    
                }

                if (idColeccionLista.Value.ToInt() != 0)
                {
                    var lista = (List<int>)Session[idColeccionLista.Value];
                    DAL.OrdenVentaFormato ordenVentaConcepto = DbUtil.Db.OrdenVentaFormatos.Single(p => p.idInternal == lista.First().ToInt());
                    LoadClienteFromOrdenVenta(ordenVentaConcepto.OrdenVentaItem);
                    LoadOrdenVenta(ordenVentaConcepto.OrdenVentaItem);
                    monedaDDL.SelectedValue = ordenVentaConcepto.OrdenVentaItem.idMoneda.ToString();
                    simbol1LBL.Text = ordenVentaConcepto.OrdenVentaItem.Moneda.simbol;
                    simbol2LBL.Text = ordenVentaConcepto.OrdenVentaItem.Moneda.simbol;
                    simbol3LBL.Text = ordenVentaConcepto.OrdenVentaItem.Moneda.simbol;
                    simbol4LBL.Text = ordenVentaConcepto.OrdenVentaItem.Moneda.simbol;
                    foreach (var item in lista)
                    {
                        var ordenVetaFormato = DbUtil.Db.OrdenVentaFormatos.Single(p => p.idInternal == item);
                        DocumentoVentaItemGrid1.LoadFromOrdenVentaFormato(idColeccion.Value.ToInt(), 
                                                    internalID.Value.ToInt(),
                                                    ordenVetaFormato);

                    };

                }
                
                

                int idEmpleadoEmisor = int.Parse(System.Web.HttpContext.Current.Session["idEmpleado"].ToString());
                vendedorLBL.Text = DbUtil.Db.Empleados.Single(p => p.idInternal == idEmpleadoEmisor).descripcion;
               // LoadItemFromOrdenVenta(ordenVentaItem);
                SetNumeroFolio();
               
            }

        }

        //private void LoadItemFromOrdenVenta(OrdenVentaItem ordenVenta)
        //{
        //    foreach (var item in ordenVenta.OrdenVentaFormatos)
        //            {
        //                DocumentoVentaItemGrid1.LoadFromOrdenVentaItem(idColeccion.Value.ToInt(), internalID.Value.ToInt(),
        //                    item);

        //            };
        //}
        private void SetNumeroFolio()
        {

            var q = DbUtil.Db.Folios.Where(p =>
                                                p.idProyecto == idProyecto.Value.ToInt() &
                                                p.idDocumentoTipo == tipoDocumentoDDL.SelectedValue.ToInt() &
                                                p.bitActivo == true);

            if (q.Count() == 0)
            {
                throw new Exception("No existe Registro de Folio");
            }

            var w = DbUtil.Db.DocumentoVentas.Where(p => p.idProyecto == idProyecto.Value.ToInt() &
                                                      p.idDocumentoTipo == tipoDocumentoDDL.SelectedValue.ToInt()
                                                      & p.bitAnulado == false);
            int numero=(w.Count()>0)? w.Max(l=>l.numeroDoc).ToInt():q.First().Inicio;
                
            Folio folio = q.First();
            serieLBL.Text = folio.serie;
            numDocumentoTXT.Text = "{0}".Fmt(folio.GetActualwithFormato(numero + 1));
            numDocumentoUPNL.Update();
        }

        //protected void conceptoDDL_SelectedIndexChanged(object sender, EventArgs e)
        //{
        //     try
        //        {
        //            if (conceptoDDL.SelectedValue.ToInt() > 0)
        //            {
        //                DocumentoVentaItemGrid1.UpdateConcepto(conceptoDDL.SelectedItem.Text); 
        //            }
        //        }
        //     catch (SqlException sqlex)
        //     {
        //         WebServerSideSqlError.Log(sqlex);

        //         ScriptManager.RegisterClientScriptBlock(this, typeof(Page),
        //          "uniqueKey" + DateTime.Now, "alert('" + sqlex.Message.Replace("'", "") + "');", true);
                 
        //     }
        //     catch (Exception ex)
        //     {
        //         WebServerSideError.Log(ex);
        //         ScriptManager.RegisterClientScriptBlock(this, typeof(Page),
        //              "uniqueKey" + DateTime.Now, "alert('" + ex.Message.Replace("'", "") + "');", true);

        //     }

        //}

        //protected void ordenventaDDL_SelectedIndexChanged(object sender, EventArgs e)
        //{
        //    if (ordenventaDDL.SelectedValue.ToInt() > 0)
        //    {
        //        try
        //        {
        //            //traemos la informacion del cliente  y la propiedad en venta
        //            var ordenVentaitem = DbUtil.Db.OrdenVentaItems.Single(p => p.idInternal == ordenventaDDL.SelectedValue.ToInt());
        //          //  LoadFromOrdenVentaItem(ordenVentaitem);

        //        }
        //        catch (SqlException sqlex)
        //        {
        //            WebServerSideSqlError.Log(sqlex);

        //            ScriptManager.RegisterClientScriptBlock(this, typeof(Page),
        //             "uniqueKey" + DateTime.Now, "alert('" + sqlex.Message.Replace("'", "") + "');", true);


        //        }
        //        catch (Exception ex)
        //        {
        //            WebServerSideError.Log(ex);
        //            ScriptManager.RegisterClientScriptBlock(this, typeof(Page),
        //                 "uniqueKey" + DateTime.Now, "alert('" + ex.Message.Replace("'", "") + "');", true);

        //        }
        //    }
        //}

       

        protected void DDL(object sender, EventArgs e)
        {
            try
            {
                if (((DropDownList)sender).ID == tipoDocumentoDDL.ID)
                {
                    if (tipoDocumentoDDL.SelectedValue.ToInt() > 0)
                    {
                        SetNumeroFolio();
                    }
                }
               




            }
            catch (SqlException sqlex)
            {
                WebServerSideSqlError.Log(sqlex);

                ScriptManager.RegisterClientScriptBlock(this, typeof(Page),
                 "uniqueKey" + DateTime.Now, "alert('" + sqlex.Message.Replace("'", "") + "');", true);
            }
            catch (Exception ex)
            {
                WebServerSideError.Log(ex);
                ScriptManager.RegisterClientScriptBlock(this, typeof(Page),
                     "uniqueKey" + DateTime.Now, "alert('" + ex.Message.Replace("'", "") + "');", true);

            }


        }


        
       
    }
}